/*Copyright (C) 2013-2021 LZE*/
#include<bits/stdc++.h>
#define INF 0x7fffffff
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int N=50010;
ll n,m,s,tot,nbs[N],dis[N],cnt[N];
bool b[N];
inline ll rd() {
	ll x=0;bool ntv=false;char c=getchar();
	while((c<'0'||c>'9')&&c!='-')c=getchar();if(c=='-')ntv=true;else x=(c^48);c=getchar();
	while(c>='0'&&c<='9') {x=x*10+(c^48);c=getchar();}return ntv?-x:x;
}
struct Edge{
	ll to,next,w;
}edge[N];
void add(ll u,ll v,ll w){
	edge[++tot].to=v;
	edge[tot].w=w;
	edge[tot].next=nbs[u];
	nbs[u]=tot;
}
bool SPFA(){
	queue<ll>Q;
	dis[s]=0;
	b[s]=true;
	Q.push(s);
	while(!Q.empty()){
		ll now=Q.front();Q.pop();
		b[now]=false;
		for(ll i=nbs[now];i;i=edge[i].next){
			Edge e=edge[i];
			if(dis[e.to]>dis[now]+e.w){
				dis[e.to]=dis[now]+e.w;
				if(!b[e.to]){
					b[e.to]=true;
					Q.push(e.to);
					if(++cnt[e.to]>=n){
						return false;
					}
				}
			}
		}
	}
	return true;
}
void init(){
	ll u,v,w;
	n=rd();m=rd();s=1;
	for(ll i=1;i<=m;i++){
		u=rd();v=rd();w=rd();
		if(w>=0){
			add(u,v,w);
			add(v,u,w);
		}else add(u,v,w);
	}
	for(ll i=1;i<=n;i++)dis[i]=INF;
}
void reset(){
	for(ll i=0;i<N;i++){
		edge[i].next=edge[i].to=edge[i].w=0;
	}
	for(ll i=0;i<N;i++)b[i]=nbs[i]=cnt[i]=dis[i]=0;
	tot=n=m=0;
}
int main() {
	int T;T=rd();
	while(T--){
		init();
		if(!SPFA()){
			cout<<"YES\n";
		}else cout<<"NO\n";
		reset();
	}
	return 0;
}